menu
  Home  ==>  articles  ==>  admin  ==>  simulateur_charges_sas   

Simulateur Charges Salarié - John COLIBRI.
Calcul Charges Sociales SAS

  • résumé : calculateur des charges sociales salariales pour directeur SAS (assimilé salarié)
  • mots clé : charges sociales, SAS, Société par Actions Simplifié, cotisations sociales, maladie, allocations familiales, retraite, complémentaire, csg, rds, csg crds non déductible, plafond sécurité sociale, 2020
  • matériel utilisé : intel i3-8100, 3.6 gHz, 8GB memory, 128 G and 1 T hard disc
  • logiciel utilisé : Windows 10 pro 64 bit, Delphi 7
  • champ d'application : Delphi 1 à 7, 2006 à 2010, Xe_nnn, Seattle, Tokyo, Berlin, Delphi 10.3
  • niveau : développeur Delphi
  • plan :


1 - Charges Sociales SAS

Nous sommes actuellement (depuis 1980 !) en SARL. Pour comparer avec d'autres formes juridiques, nous souhaitions pouvoir comparer les diverses charges sociales.

Cet article va donc permettre de calculer les charges sociales d'un directgeur de SAS (Société par Actions Simplifié)




2 - Calcul des Charges salariales

2.1 - Les Paramètres

Nous avons placés les paramètres des charges dans un fichier .TXT. Ceci permet de faire les calculs sur des valeurs de taux différentes (si les règles de calcul ne changent pas trop)

 
          // sas 2020
plafond_secu pss 41136,0000 -
  calcul salariré employeur
___sécurité_sociale maladie_maternité T - 13,0000 invalidité_décès vieillesse_plafonnée P 6,9000 8,5500 vieillesse_déplafonnée T 0,4000 1,9000 allocations_familiales T - 5,2500 accidents_du_travail T - 1,0000
contribution_de_solidarité T - 0,3000 pour_l’autonomie
___cotisation_logement_(fnal) employeurs_-_50_salariés P - 0,1000 employeurs_+_50_salariés t - 0,5000
assurance_chômage T_<_4 - 4,0500
fonds_de_garantie T_<_4 - 0,1500
des_salaires_(ags)
APEC T_<_4 0,0240 0,0360
___retraite_complémentaire cotisation_agirc_arrco_1 T 3,1500 4,7200 cotisation_agirc_arrco_2 T_1_8 8,6400 12,9500 contribution_d’équilibre_1 T 0,8600 1,2900 général contribution_d’équilibre_2 T_1_8 1,0800 1,6200 général contribution_d’équilibre_3 T_<_8 0,1400 0,1000
technique prévoyance_cadres P - 1,5000
forfait_social_sur_la f_soc - 8,0000 contribution_patronale de_prévoyance
contribution_au_financement T - 0,0160 des_organisations_prof et_syndicales
versement_transport T - -
formation_professionnelle x - 0,575 taxe_apprentissage x - 0,68
CSG_CRDS_non_déductible CSG 2,9000 - CSG_déductible CSG 6,8000 -



2.2 - Calculs

La colonne "calcul" indique comment calculer les charges. Le "salaire" est le salaire brut. Le "plafond sécu" est le plafond de la sécurités sociale

Les charges sont calculées en utilisant

  • T : le salaire total
  • P : le salaire ne dépassant pas le plafond de la sécu
  • T_<_4 : salaire ne dépassant pas 4 fois le plafond de la sécu
  • T_<_8 : salaire ne dépassant pas 8 fois le plafond de la sécu
  • T_1_8 : la partie du salaire comprise entre la plafond de la sécu mais ne dépalssant pas 8 fois le plafond
  • CSG: la base est 0.9825* 4* (plafond sécu) + montant au delà de 4 plafonds

  • t, x, f_soc: nous avons vu ces charges mentionnées mais ne savons pas les calculer



3 - Le Projet Delphi de calcul de charges

3.1 - La classe de calcul

Chaque paramètre (une ligne de la table ci-dessus) est défini par

Voici la définition de la classe de calcul:

Type c_sas_parameter// one "sas_parameter"
         Class(c_basic_object)
           // -- m_name: the key of the parameter

           m_policyString;
           m_employee_ratem_company_rateDouble;

           Constructor create_sas_parameter(p_nameString);
           Function f_c_selfc_sas_parameter;

           Function f_display_sas_parameterString;

           Destructor DestroyOverride;
         End// c_sas_parameter

et nous définission la classe c_sas_parameter_list_2 qui est une liste de ces paramètres



Les paramètres sont chargés en analysant le fichier .txt des paramètres

Procedure c_sas_parameter_list_2.load_from_file(p_pathp_file_nameString);
  Var l_c_parameter_stringlistc_stringlist;

  Function _f_next_valueString;
    Var l_valueString;
    Begin
      l_value:= l_c_parameter_stringlist.f_next_value;

      If (l_value''Or (l_value'-')
        Then Result:= '0'
        Else Result:= l_value;
    End// _f_next_value

  Var l_keyl_policyl_employee_valuel_company_valueString;

  Begin // load_from_file
    l_c_parameter_stringlist:= c_stringlist.create_stringlist('',
        p_pathp_file_name);

    With l_c_parameter_stringlist Do
    Begin
      stop_if_empty;
      display(m_c_stringlist.Text);

      While Not f_end_of_file Do
      Begin
        display(m_the_line);

        If Not f_is_blank_or_comment
          Then Begin
              l_key:= f_next_value;
              l_policy:= f_next_value;
              // l_key:= f_replace_character(l_key, '-', '_');
              If l_policy''
                Then l_key:= f_spaces(m_indentation)+ l_key;
              l_employee_value:= _f_next_value;
              l_company_value:= _f_next_value;
              With f_c_add_sas_parameter(l_keyDo
              Begin
                m_policy:= l_policy;
                m_employee_rate:= StrToFloat(l_employee_value);
                m_company_rate:= StrToFloat(l_company_value);
              End;
            End
          Else
            If (m_title''And (m_trimmed_line<> '')
              Then m_title:= m_trimmed_line
              Else
                With f_c_add_sas_parameter(m_the_lineDo
                  If m_trimmed_line''
                    Then m_name:= '';

        read_line;
      End// while not f_end_of_file

      Free;
    End// with l_c_parameter_stringlist
    display(m_c_sas_parameter_list.Text);
  End// load_from_file



3.2 - Les calculs

La classe qui fait les calculs est

Type c_calcul_charges_sas=
         Class(c_basic_object)
           m_c_sas_parameter_list_2_refc_sas_parameter_list_2;
           m_month_countInteger;

           Constructor create_calcul_charges_sas(p_nameString;
               p_c_sas_parameter_list_2_refc_sas_parameter_list_2);
           Procedure compute_charges(p_salaryDouble);
           Destructor DestroyOverride;
         End// c_calcul_charges_sas

et la procédure de calcul est:

Procedure c_calcul_charges_sas.compute_charges(p_salaryDouble);
  Var l_total_employeel_total_companyDouble;
      l_plafond_secuDouble;
      l_prevoyance_pour_csgDouble;

  Procedure _display(p_keyp_policyString;
      p_basep_employee_ratep_employee_amoutp_company_ratep_company_amountDouble);

    Procedure _format(p_ratep_valueDoubleVar pv_ratepv_valueString);
      Begin
        pv_rate:= ''pv_value:= '';
        If p_rate<> 0
          Then Begin
              pv_rate:= Format('%7.3f', [p_rate]);
              pv_value:= Format('%10.2f', [p_value]);
            End;
      End// _format

    Var l_employee_ratel_employee_amountString;
        l_company_ratel_company_amountString;

    Begin // _display
      _format(p_employee_ratep_employee_amoutl_employee_ratel_employee_amount);
      _format(p_company_ratep_company_amountl_company_ratel_company_amount);

      display(Format('%-27s %-5s %10.2f   %7s %10s     %7s %10s',
           [p_keyp_policyp_basel_employee_ratel_employee_amount,
            l_company_ratel_company_amount]));

      l_total_employee:= l_total_employeep_employee_amout;
      l_total_company:= l_total_companyp_company_amount;
      If p_key'prevoyance_cadre'
        Then l_prevoyance_pour_csg:= l_prevoyance_pour_csgp_company_amount;
    End// _display

  Procedure _compute_on_full_salary(p_c_sas_parameterc_sas_parameter);
    Var l_employee_amountl_company_amountDouble;
    Begin
      With p_c_sas_parameter Do
      Begin
        l_employee_amount:= p_salarym_employee_rate/ 100;
        l_company_amount:= p_salarym_company_rate/ 100;
        _display(m_namem_policyp_salary,
            m_employee_ratel_employee_amountm_company_ratel_company_amount);
      End;
    End// _compute_on_full_salary

  Procedure _compute_on_plafond_secu(p_c_sas_parameterc_sas_parameter);
    Var l_baseDouble;
        l_employee_amountl_company_amountDouble;
    Begin
      With p_c_sas_parameter Do
      Begin
        l_base:= Min(l_plafond_secup_salary);
        l_employee_amount:= l_basem_employee_rate/ 100;
        l_company_amount:= l_basem_company_rate/ 100;
        _display(m_namem_policyl_base,
            m_employee_ratel_employee_amountm_company_ratel_company_amount);
      End;
    End// _compute_on_plafond_secu

  Procedure _compute_retraite_1_a_8_plafond(p_c_sas_parameterc_sas_parameter);
    Var l_baseDouble;
        l_employee_amountl_company_amountDouble;
    Begin
      With p_c_sas_parameter Do
      Begin
        // display(Format('%10.f %10.2f', [p_salary, l_plafond_secu]));
        l_base:= Min(l_plafond_secu* 8, p_salary);
        // display(Format('%10.f', [l_base]));
        l_base:= l_basel_plafond_secu;
        // display(Format('%10.f', [l_base]));
        If l_base> 0
          Then Begin
              l_employee_amount:= l_basem_employee_rate/ 100;
              l_company_amount:= l_basem_company_rate/ 100;
              _display(m_namem_policyl_base,
                  m_employee_ratel_employee_amountm_company_ratel_company_amount);
            End;
      End;
    End// _compute_retraite_1_a_8_plafond

  Procedure _compute_on_total_up_to_4_plafond(p_c_sas_parameterc_sas_parameter);
    Var l_baseDouble;
        l_employee_amountl_company_amountDouble;
    Begin
      With p_c_sas_parameter Do
      Begin
        l_base:= Min(p_salaryl_plafond_secu* 4);
        l_employee_amount:= l_basem_employee_rate/ 100;
        l_company_amount:= l_basem_company_rate/ 100;
        _display(m_namem_policyl_base,
            m_employee_ratel_employee_amountm_company_ratel_company_amount);
      End;
    End// _compute_on_total_up_to_4_plafond

  Procedure _compute_on_total_up_to_8_plafond(p_c_sas_parameterc_sas_parameter);
    Var l_baseDouble;
        l_employee_amountl_company_amountDouble;
    Begin
      With p_c_sas_parameter Do
      Begin
        l_base:= Min(p_salaryl_plafond_secu* 8);
        l_employee_amount:= l_basem_employee_rate/ 100;
        l_company_amount:= l_basem_company_rate/ 100;
        _display(m_namem_policyl_base,
            m_employee_ratel_employee_amountm_company_ratel_company_amount);
      End;
    End// _compute_on_total_up_to_8_plafond

  Procedure _compute_on_total_1_to_8_plafond(p_c_sas_parameterc_sas_parameter);
    Var l_baseDouble;
        l_employee_amountl_company_amountDouble;
    Begin
      With p_c_sas_parameter Do
      Begin
        l_base:= Min(p_salaryl_plafond_secu* 8)- l_plafond_secu;
        If l_base> 0
          Then Begin
              l_employee_amount:= l_basem_employee_rate/ 100;
              l_company_amount:= l_basem_company_rate/ 100;
              _display(m_namem_policyl_base,
                  m_employee_ratel_employee_amountm_company_ratel_company_amount);
            End;
      End;
    End// _compute_on_total_1_to_8_plafond

  Procedure _compute_csg(p_c_sas_parameterc_sas_parameter);
    Var l_maxl_baseDouble;
        l_employee_amountDouble;
    Begin
      With p_c_sas_parameter Do
      Begin
        l_base:= Min(p_salaryl_plafond_secu* 4)* 0.9825;
        If p_salaryl_plafond_secu* 4
          Then l_base:= l_base+ (p_salaryl_plafond_secu* 4);

        l_base:= l_basel_prevoyance_pour_csg;

        l_employee_amount:= p_salarym_employee_rate/ 100;
        _display(m_namem_policyl_base,
            m_employee_ratel_employee_amount, 0, 0);
      End;
    End// _compute_csg

  Var l_sas_parameter_indexInteger;

  Begin // compute_charges
    l_total_employee:= 0; l_total_company:= 0;
    l_prevoyance_pour_csg:= 0;

    display_line;
    display(Format('--- Charges SAS. Salaire %10.2f', [p_salary]));

    With m_c_sas_parameter_list_2_ref Do
    Begin
      l_plafond_secu:= f_c_find_sas_parameter_by_name('plafond_secu').m_employee_rate;

      For l_sas_parameter_index:= 0 To f_sas_parameter_count- 1 Do
        With f_c_sas_parameter(l_sas_parameter_indexDo
          If m_policy'T'
            Then _compute_on_full_salary(f_c_selfElse
          If m_policy'P'
            Then _compute_on_plafond_secu(f_c_selfElse
          If m_policy'B_1_8'
            Then _compute_retraite_1_a_8_plafond(f_c_selfElse
          If m_policy'T_<_4'
            Then _compute_on_total_up_to_4_plafond(f_c_selfElse
          If m_policy'T_1_8'
            Then _compute_on_total_1_to_8_plafond(f_c_selfElse
          If m_policy'T_<_8'
            Then _compute_on_total_up_to_8_plafond(f_c_selfElse
          If m_policy'CSG'
            Then _compute_csg(f_c_self)
            Else
              If m_policy''
                Then display_line
                Else  _display(m_namem_policyp_salary, 0, 0, 0, 0);
    End// with m_c_sas_parameter_list_2_ref

    display_line;
    display(Format('total %s      %6.2f  %10.2f %s   %6.2f  %10.2f',
        [f_spaces(10+ 25), l_total_employeep_salary*100, l_total_employee,
         f_spaces(1), l_total_companyp_salary* 100, l_total_company]));

    display_line;
    display(Format('overall %s      %10.2f  %10.2f    %6.2f',
        [f_spaces(3), p_salary,
         l_total_employeel_total_company,
         (l_total_employeel_total_company)/ p_salary* 100]));
  End// compute_charges



4 - Mini How To

Voici l'image de l'application

simulateur_charges_salariales_sas

Donc

  • initialisez le fichier des paramètres. 2020 est fourni dans le .ZIP
  • sélectionnez le fichier de paramètres dans la tFileListBox
  • entrez le salaire
    • soit en cliquant un des trois tRadioButton (< plafond, > plafond, >> plafond)
    • soit en saisissant manuellement la valeura qui vous intéress
  • cliquez "compute_"
Nous avons utilisé comme exemple une valeur mettant en oeuvre tous les taux. Nous avons validé les calculs à l'aide d'articles Internet, sans garantie toutefois (ils peuvent se tromper comme nous !)




5 - Améliorations

5.1 - Quelques pistes

  • nous n'avons pas traités tous les cas spéciaux (cotisations minimales, départements d'Alsace etc)


5.2 - Liens

Quelques liens pour trouver des taux et aussi


6 - Télécharger le code source Delphi

Vous pouvez télécharger: Ce .ZIP qui comprend:
  • le .DPR, la forme principale, les formes annexes eventuelles
  • les fichiers de paramètres (le schéma et le batch de création)
  • dans chaque .ZIP, toutes les librairies nécessaires à chaque projet (chaque .ZIP est autonome)
Ces .ZIP, pour les projets en Delphi 6, contiennent des chemins RELATIFS. Par conséquent:
  • créez un répertoire n'importe où sur votre machine
  • placez le .ZIP dans ce répertoire
  • dézippez et les sous-répertoires nécessaires seront créés
  • compilez et exécutez
Ces .ZIP ne modifient pas votre PC (pas de changement de la Base de Registre, de DLL ou autre). Pour supprimer le projet, effacez le répertoire.

La notation utilisée est la notation alsacienne qui consiste à préfixer les identificateurs par la zone de compilation: K_onstant, T_ype, G_lobal, L_ocal, P_arametre, F_unction, C_lasse. Elle est présentée plus en détail dans l'article La Notation Alsacienne



Comme d'habitude:

  • nous vous remercions de nous signaler toute erreur, inexactitude ou problème de téléchargement en envoyant un e-mail à jcolibri@jcolibri.com. Les corrections qui en résulteront pourront aider les prochains lecteurs
  • tous vos commentaires, remarques, questions, critiques, suggestion d'article, ou mentions d'autres sources sur le même sujet seront de même les bienvenus à jcolibri@jcolibri.com.
  • plus simplement, vous pouvez taper (anonymement ou en fournissant votre e-mail pour une réponse) vos commentaires ci-dessus et nous les envoyer en cliquant "envoyer" :
    Nom :
    E-mail :
    Commentaires * :
     

  • et si vous avez apprécié cet article, faites connaître notre site, ajoutez un lien dans vos listes de liens ou citez-nous dans vos blogs ou réponses sur les messageries. C'est très simple: plus nous aurons de visiteurs et de références Google, plus nous écrirons d'articles.



7 - L'auteur

John COLIBRI est passionné par le développement Delphi et les applications de Bases de Données. Il a écrit de nombreux livres et articles, et partage son temps entre le développement de projets (nouveaux projets, maintenance, audit, migration BDE, migration Xe_n, refactoring) pour ses clients, le conseil (composants, architecture, test) et la formation. Son site contient des articles avec code source, ainsi que le programme et le calendrier des stages de formation Delphi, base de données, programmation objet, Services Web, Tcp/Ip et UML qu'il anime personellement tous les mois, à Paris, en province ou sur site client.
Created: jan-04. Last updated: mar-2020 - 250 articles, 620 .ZIP sources, 3303 figures
Contact : John COLIBRI - Tel: 01.42.83.69.36 / 06.87.88.23.91 - email:jcolibri@jcolibri.com
Copyright © J.Colibri   http://www.jcolibri.com - 2001 - 2020
Retour:  Home  Articles  Formations  Développement Delphi  Livres  Pascalissime  Liens  Download
l'Institut Pascal

John COLIBRI

+ Home
  + articles_avec_sources
    + bases_de_donnees
    + web_internet_sockets
    + services_web_
    + prog_objet_composants
    + office_com_automation
    + colibri_utilities
    + uml_design_patterns
    + graphique
    + delphi
    + outils
    + firemonkey
    + vcl_rtl
    + colibri_helpers
    + colibri_skelettons
    + admin
      – simul_charges_tns
      – simul_charges_salarie
      – simul_impots_societes
      – simul_impots_revenu
      – choix_salaire_divid
      – calcul_salaire_divid
  + formations
  + developpement_delphi
  + présentations
  + pascalissime
  + livres
  + entre_nous
  – télécharger

contacts
plan_du_site
– chercher :

RSS feed  
Blog